program mycox, sortpreserve
	version 8.1
	if replay() {
		if (`"`e(cmd)'"' != "mycox") error 301
		Replay `0'
	}
	else	Estimate `0'
end

program Estimate, eclass
	syntax varlist(min=3) [if] [in]		///
		[fweight] [,			///
		FAILure(varname numeric)	///
		noLOg				/// -ml model- options
		noLRTEST			///
		Level(integer `c(level)')	/// -Replay- options
		HR				///
		*				/// -mlopts- options
	]

	// check syntax
	local diopts level(`level') `hr'
	mlopts mlopts , `options'
	local cns `s(constraints)'
	gettoken time rhs : varlist
	tempvar negt
	quietly gen double `negt' = -`time'
	sort `negt' `failure'
	if "`failure'" == "" {
		tempvar failure
		gen byte `failure' = 1
	}
	if "`weight'" != "" {
		tempvar wvar
		quietly gen double `wvar' `exp'
		local wgt "[`weight'=`wvar']"
	}
	if "`cns'" != "" {
		local lrtest nolrtest
	}

	// mark the estimation sample
	marksample touse
	markout `touse' `wvar' `failure'

	// fit constant-only model
	if "`lrtest'" == "" {
		quietly ml model d0 mycox2_d0			///
			(xb: `negt' `failure' = `rhs',		///
				noconstant			///
			)					///
			`wgt' if `touse',			///
			iterate(0)				///
			nocnsnotes missing maximize
		local initopt lf0(0 `e(ll)')
	}

	// fit the full model
	`qui' di as txt _n "Fitting full model:"
	ml model d0 mycox2_d0				///
		(xb: `negt' `failure' = `rhs',		///
			noconstant			///
		)					///
		`wgt' if `touse',			///
		`log' `mlopts' `initopt'		///
		missing maximize

	// dependent variables
	ereturn local depvar `time' `failure'
	// save a title for -Replay- and the name of this command
	ereturn local title "My cox estimates"
	ereturn local cmd mycox

	Replay , `diopts'
end

program Replay
	syntax [, Level(integer `c(level)') HR ]
	ml display , level(`level') `hr'
end
